import type { Recordable } from '@vben/types';

import { requestClient } from '#/api/request';

export namespace SystemMenuApi {
  /** 徽标颜色集合 */
  export const BadgeVariants = [
    'default',
    'destructive',
    'primary',
    'success',
    'warning',
  ] as const;
  /** 徽标类型集合 */
  export const BadgeTypes = ['dot', 'normal'] as const;

  /** 菜单类型集合 */
  export const MenuTypes = ['catalog', 'menu', 'button'] as const;

  /** vben系统菜单 */
  export interface SystemMenu {
    [key: string]: any;
    /** 后端权限标识 */
    authCode: string;
    /** 子级 */
    children?: SystemMenu[];
    /** 组件 */
    component?: string;
    /** 菜单ID */
    id: string;
    /** 菜单元数据 */
    meta?: {
      /** 激活时显示的图标 */
      activeIcon?: string;
      /** 作为路由时，需要激活的菜单的Path */
      activePath?: string;
      /** 固定在标签栏 */
      affixTab?: boolean;
      /** 在标签栏固定的顺序 */
      affixTabOrder?: number;
      /** 徽标内容(当徽标类型为normal时有效) */
      badge?: string;
      /** 徽标类型 */
      badgeType?: (typeof BadgeTypes)[number];
      /** 徽标颜色 */
      badgeVariants?: (typeof BadgeVariants)[number];
      /** 在菜单中隐藏下级 */
      hideChildrenInMenu?: boolean;
      /** 在面包屑中隐藏 */
      hideInBreadcrumb?: boolean;
      /** 在菜单中隐藏 */
      hideInMenu?: boolean;
      /** 在标签栏中隐藏 */
      hideInTab?: boolean;
      /** 菜单图标 */
      icon?: string;
      /** 内嵌Iframe的URL */
      iframeSrc?: string;
      /** 是否缓存页面 */
      keepAlive?: boolean;
      /** 外链页面的URL */
      link?: string;
      /** 同一个路由最大打开的标签数 */
      maxNumOfOpenTab?: number;
      /** 无需基础布局 */
      noBasicLayout?: boolean;
      /** 是否在新窗口打开 */
      openInNewWindow?: boolean;
      /** 菜单排序 */
      order?: number;
      /** 额外的路由参数 */
      query?: Recordable<any>;
      /** 菜单标题 */
      title?: string;
    };
    /** 菜单名称 */
    name: string;
    /** 路由路径 */
    path: string;
    /** 父级ID */
    pid: string;
    /** 重定向 */
    redirect?: string;
    /** 菜单类型 */
    type: (typeof MenuTypes)[number];
  }

  /** 后端系统菜单表 */
  export interface Menu {
    id?: number;
    code: string;
    name: string;
    status?: number;
    remark?: any;
    menu_type: (typeof MenuTypes)[number];
    icon?: string;
    path: string;
    order?: number;
    parent_id?: number;
    is_hidden?: boolean;
    component?: string;
    keepalive?: boolean;
    redirect?: string;
    title?: string;
    created_at?: string;
    updated_at?: string;
    children?: Menu[];
  }
}

// =====================系统框架需要的接口====================
/**
 * 获取菜单数据列表
 */
async function getMenuList() {
  return requestClient.get<Array<SystemMenuApi.SystemMenu>>(
    '/v1/base/all-vben-menu',
  );
}

/**
 * 获取用户权限列表
 */
async function getExistsPermissionList(roleId: number) {
  return requestClient.get<{
    apis: string[];
    menus: string[];
  }>(`/v1/base/role-permissions?role_id=${roleId}`);
}

async function isMenuNameExists(
  name: string,
  id?: SystemMenuApi.SystemMenu['id'],
) {
  return requestClient.get<boolean>('/system/menu/name-exists', {
    params: { id, name },
  });
}

async function isMenuPathExists(
  path: string,
  id?: SystemMenuApi.SystemMenu['id'],
) {
  return requestClient.get<boolean>('/system/menu/path-exists', {
    params: { id, path },
  });
}
// =====================系统框架需要的接口====================

// =======================菜单管理的接口======================
/**
 * 获取菜单列表
 */
async function getAllMenuList(params?: { code?: string; name?: string }) {
  return requestClient.get<Array<SystemMenuApi.Menu>>('/v1/menu/list', {
    params,
  });
}

/**
 * 根据ID获取菜单
 */
async function getMenuById(id: number) {
  return requestClient.get<SystemMenuApi.Menu>(`/v1/menu/${id}`);
}

/**
 * 创建菜单
 */
async function createMenu(data: Partial<SystemMenuApi.Menu>) {
  return requestClient.post('/v1/menu/', data);
}

/**
 * 更新菜单
 */
async function updateMenu(data: SystemMenuApi.Menu) {
  return requestClient.put('/v1/menu/', data);
}

/**
 * 删除菜单
 */
async function deleteMenu(id: number) {
  return requestClient.delete(`/v1/menu/${id}`);
}
// =======================菜单管理的接口======================

export {
  createMenu,
  deleteMenu,
  getAllMenuList,
  getExistsPermissionList,
  getMenuById,
  getMenuList,
  isMenuNameExists,
  isMenuPathExists,
  updateMenu,
};
